home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / sbin / apparmor_status < prev    next >
Text File  |  2009-11-03  |  6KB  |  220 lines

  1. #!/usr/bin/perl -w
  2. # $Id: apparmor_status 1076 2008-01-05 08:29:39Z jrjohansen $
  3. # ------------------------------------------------------------------
  4. #
  5. #    Copyright (C) 2005-2006 Novell/SUSE
  6. #
  7. #    This program is free software; you can redistribute it and/or
  8. #    modify it under the terms of version 2 of the GNU General Public
  9. #    License published by the Free Software Foundation.
  10. #
  11. # ------------------------------------------------------------------
  12.  
  13.  
  14. use strict;
  15. use Getopt::Long;
  16. use Cwd 'abs_path';
  17.  
  18. my $confdir = "/etc/apparmor";
  19. my $sd_mountpoint;
  20. my $check_enabled = 0;
  21. my $count_enforced = 0;
  22. my $count_profiled = 0;
  23. my $count_complain = 0;
  24. my $verbose = 0;
  25. my $help;
  26.  
  27. GetOptions(
  28.   'complaining'        => \$count_complain,
  29.   'enabled'        => \$check_enabled,
  30.   'enforced'        => \$count_enforced,
  31.   'profiled'        => \$count_profiled,
  32.   'verbose|v'        => \$verbose,
  33.   'help|h'        => \$help,
  34. ) or usage();
  35.  
  36. sub usage {
  37.   print "Usage: $0 [OPTIONS]\n";
  38.   print "Displays various information about the currently loaded AppArmor policy.\n";
  39.   print "OPTIONS (one only):\n";
  40.   print "  --enabled       returns error code if subdomain not enabled\n";
  41.   print "  --profiled      prints the number of loaded policies\n";
  42.   print "  --enforced      prints the number of loaded enforcing policies\n";
  43.   print "  --complaining   prints the number of loaded non-enforcing policies\n";
  44.   print "  --verbose       (default) displays multiple data points about loaded policy set\n";
  45.   print "  --help          this message\n";
  46.   exit;
  47. }
  48.  
  49. $verbose = 1 if ($count_complain + $check_enabled + $count_enforced + $count_profiled == 0);
  50. usage() if $help or ($count_complain + $check_enabled + $count_enforced + $count_profiled + $verbose > 1);
  51.  
  52. sub is_subdomain_loaded() {
  53.   return 1 if (-d "/sys/module/apparmor");
  54.   if(open(MODULES, "/proc/modules")) {
  55.     while(<MODULES>) {
  56.       return 1 if m/^(subdomain|apparmor)\s+/;
  57.     }
  58.   }
  59.  
  60.   return 0;
  61. }
  62.  
  63. sub find_subdomainfs() {
  64.  
  65.   my $sd_mountpoint;
  66.   if(open(MOUNTS, "/proc/mounts")) {
  67.     while(<MOUNTS>) {
  68.       $sd_mountpoint = "$1/apparmor" if m/^\S+\s+(\S+)\s+securityfs\s/ && -e "$1/apparmor";
  69.       $sd_mountpoint = "$1/subdomain" if m/^\S+\s+(\S+)\s+securityfs\s/ && -e "$1/subdomain";
  70.       $sd_mountpoint = $1 if m/^\S+\s+(\S+)\s+subdomainfs\s/ && -e "$1";
  71.     }
  72.     close(MOUNTS);
  73.   }
  74.  
  75.   return $sd_mountpoint;
  76. }
  77.  
  78. sub get_profiles {
  79.   my $mountpoint = shift;
  80.   my %profiles = ();
  81.  
  82.   if (open(PROFILES, "$mountpoint/profiles")) {
  83.     while(<PROFILES>) {
  84.       $profiles{$1} = $2 if m/^([^\(]+)\s+\((\w+)\)$/;
  85.     }
  86.     close(PROFILES);
  87.   }
  88.   return (%profiles);
  89. }
  90.  
  91. sub get_processes {
  92.   my %profiles = @_;
  93.   my %processes = ();
  94.   if (opendir(PROC, "/proc")) {
  95.     my $file;
  96.     while (defined($file = readdir(PROC))) {
  97.       if ($file =~ m/^\d+/) {
  98.         if (open(CURRENT, "/proc/$file/attr/current")) {
  99.           while (<CURRENT>) {
  100.             if (m/^([^\(]+)\s+\((\w+)\)$/) {
  101.               $processes{$file}{'profile'} = $1;
  102.               $processes{$file}{'mode'} = $2;
  103.             } elsif (grep(abs_path("/proc/$file/exe") eq $_ , keys(%profiles))) {
  104.               # keep only unconfined processes that have a profile defined
  105.               $processes{$file}{'profile'} = abs_path("/proc/$file/exe");
  106.               $processes{$file}{'mode'} = 'unconfined';
  107.             }
  108.           }
  109.           close(CURRENT);
  110.         }
  111.       }
  112.     }
  113.     closedir(PROC);
  114.   }
  115.   return (%processes);
  116. }
  117.  
  118. my $is_loaded = is_subdomain_loaded();
  119.  
  120. if (!$is_loaded) {
  121.   print STDERR "apparmor module is not loaded.\n" if $verbose;
  122.   exit 1;
  123. }
  124.  
  125. print "apparmor module is loaded.\n" if $verbose;
  126.  
  127. $sd_mountpoint = find_subdomainfs();
  128. if (!$sd_mountpoint) {
  129.   print STDERR "apparmor filesystem is not mounted.\n" if $verbose;
  130.   exit 3;
  131. }
  132.  
  133. if (! -r "$sd_mountpoint/profiles") {
  134.   print STDERR "You do not have enough privilege to read the profile set.\n" if $verbose;
  135.   exit 4;
  136. }
  137.  
  138. #print "subdomainfs is at $sd_mountpoint.\n" if $verbose;
  139.  
  140. # processes is a hash table :
  141. #   * keys : processes pid
  142. #   * values : hash containing information about the running process:
  143. #       * 'profile' : name of the profile applied to the running process
  144. #       * 'mode' : mode of the profile applied to the running process
  145. my %processes = ();
  146. my %enforced_processes = ();
  147. my %complain_processes = ();
  148. my %unconfined_processes = ();
  149.  
  150. # profiles is a hash table :
  151. #  * keys : profile name
  152. #  * value : profile mode
  153. my %profiles;
  154. my @enforced_profiles = ();
  155. my @complain_profiles = ();
  156.  
  157. %profiles = get_profiles($sd_mountpoint);
  158. @enforced_profiles = grep { $profiles{$_} eq 'enforce' } keys %profiles;
  159. @complain_profiles = grep { $profiles{$_} eq 'complain' } keys %profiles;
  160.  
  161. # we consider the case where no profiles are loaded to be "disabled" as well
  162. my $rc = (keys(%profiles) == 0) ? 2 : 0;
  163.  
  164. if ($check_enabled) {
  165.   exit $rc;
  166. }
  167.  
  168. if ($count_profiled) {
  169.   print scalar(keys(%profiles)). "\n";
  170.   exit $rc;
  171. }
  172.  
  173. if ($count_enforced) {
  174.   print $#enforced_profiles + 1 . "\n";
  175.   exit $rc;
  176. }
  177.  
  178. if ($count_complain) {
  179.   print $#complain_profiles + 1 . "\n";
  180.   exit $rc;
  181. }
  182.  
  183.  
  184. if ($verbose) {
  185.   print keys(%profiles) . " profiles are loaded.\n";
  186.   print $#enforced_profiles + 1 . " profiles are in enforce mode.\n";
  187.   for (@enforced_profiles) {
  188.     print "   " . $_ . "\n";
  189.   }
  190.   print $#complain_profiles + 1 . " profiles are in complain mode.\n";
  191.   for (@complain_profiles) {
  192.     print "   " . $_ . "\n";
  193.   }
  194. }
  195.  
  196. %processes = get_processes(%profiles);
  197. if ($verbose) {
  198.   for (keys(%processes)) {
  199.     $enforced_processes{$_} = $processes{$_} if $processes{$_}{'mode'} eq 'enforce';
  200.     $complain_processes{$_} = $processes{$_} if $processes{$_}{'mode'} eq 'complain';
  201.     # some early code uses unconfined instead of unconfined.
  202.     $unconfined_processes{$_} = $processes{$_} if $processes{$_}{'mode'} =~ /uncon(fi|strai)ned/;
  203.   }
  204.   print keys(%processes) . " processes have profiles defined.\n";
  205.   print keys(%enforced_processes) . " processes are in enforce mode :\n";
  206.   for (keys(%enforced_processes)) {
  207.     print "   " . $enforced_processes{$_}{'profile'} . " ($_) \n";
  208.   }
  209.   print keys(%complain_processes) . " processes are in complain mode.\n";
  210.   for (keys(%complain_processes)) {
  211.     print "   " . $complain_processes{$_}{'profile'} . " ($_) \n";
  212.   }
  213.   print keys(%unconfined_processes) . " processes are unconfined but have a profile defined.\n";
  214.   for (keys(%unconfined_processes)) {
  215.     print "   " . $unconfined_processes{$_}{'profile'} . " ($_) \n";
  216.   }
  217. }
  218.  
  219. exit $rc;
  220.